/*Copyright (C) 2009 Careil Baptiste

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
//
///////////////////////////////////////////////////////////
/// \file IO.h Ce fichier contient les principales fonctions qui
/// interagissent avec les entrées et sorties
///////////////////////////////////////////////////////////
#ifndef CSLP_COLOR_HEADER
#define CSLP_COLOR_HEADER

#include "System.h"

#ifdef __cplusplus
extern "C" {
#endif

///////////////////////////////////////////////////////////
/// Permet d'effacer l'écran
///////////////////////////////////////////////////////////
void CSLP_ClearScreen();

/*
 * Fonctions et énumérations permettant de modifier les couleurs
 * de la console.
 */

///////////////////////////////////////////////////////////
/// Enumération des couleurs.
///
/// Permet de choisir une couleur. La palette est constituée de 16
/// couleurs. Pour passer à la palette "clair", faites COLOR|LIGHT
/// ou COLOR est la couleur choisit.\n
/// Default est la couleur par défaut
/// du système.
///
/// \sa CSLP_Color(), CSLP_ColorText(), CSLP_ColorBG()
///////////////////////////////////////////////////////////
typedef enum CSLP_COLORTYPE {//	TXT  BG	       TXT BG
	BLACK,		//UNIX: 30 | 40, WIN32: 0
	RED,		//UNIX: 31 | 41, WIN32: 4 | *16
	GREEN,		//UNIX: 32 | 42, WIN32: 2 | *16
	YELLOW,		//UNIX: 33 | 43, WIN32: 6 | *16
	BLUE,		//UNIX: 34 | 44, WIN32: 1 | *16
	VIOLET,		//UNIX: 35 | 45, WIN32: 5 | *16
	CYAN,		//UNIX: 36 | 46, WIN32: 3 | *16
	WHITE,		//UNIX: 37 | 47, WIN32: 7 | *16
	DEFAULT,	//UNIX: 39 | 49, WIN32: 7 | 0
	LIGHT = 16	//UNIX:+60 |+60, WIN32:+8 | *16
} CSLP_COLORTYPE;

///////////////////////////////////////////////////////////
/// Permet de réinitialiser les couleurs par défaut de la console.
/// Soit noir sur blanc pour WIN32 et paramètre par défaut pour UNIX
///
/// \sa CSLP_Color(), CSLP_ColorText(), CSLP_ColorBG()
///
///////////////////////////////////////////////////////////
void CSLP_ResetColors();

///////////////////////////////////////////////////////////
/// Permet d'initialiser la couleur de texte de la console
/// La couleur du texte est gardée tant qu'elle n'a pas été
/// changée ou réinitialisée
///
/// \sa CSLP_ResetColors(), CSLP_ColorBG(), CSLP_Color(), CSLP_COLORTYPE
///////////////////////////////////////////////////////////
void CSLP_ColorText(CSLP_COLORTYPE color);

///////////////////////////////////////////////////////////
/// Permet d'initialiser la couleur de fond de la console
/// La couleur du fond est gardée tant qu'elle n'a pas été
/// changée ou réinitialisée
///
/// \sa CSLP_ResetColors, CSLP_ColorTxt, CSLP_Color(), CSLP_COLORTYPE
///////////////////////////////////////////////////////////
void CSLP_ColorBG(CSLP_COLORTYPE color);

///////////////////////////////////////////////////////////
/// Permet l'initialisation de la couleur du fond de la console et du texte
///
/// \sa CSLP_ResetColors, CSLP_ColorTxt, CSLP_ColorBG, CSLP_COLORTYPE
///////////////////////////////////////////////////////////
void CSLP_Color(CSLP_COLORTYPE txt, CSLP_COLORTYPE bg);

/*
 * Fonctions pour récupérer les touches claviers pressées sans attendre
 * le '\n'. Equivalent de getch et kbhit de windows.h
 * (utilise CSLP_Thread*)
 */

///////////////////////////////////////////////////////////
/// Permet de surveiller la pression d'une touche par l'utilisateur.\n
/// Lire l'entrée stdin entre un appelle CSLP_PollChar() et CSLP_GetChar()
/// a un comportement indéfinit.
///
/// \return 0 si aucune touche n'a été appuyée
/// \return Une valeur négative en cas d'erreur
/// \return Une valeur positive si une touche est pressée
/// \sa CSLP_GetChar(), CSLP_WaitChar()
///////////////////////////////////////////////////////////
int CSLP_PollChar();

///////////////////////////////////////////////////////////
/// Permet de récupérer la touche pressé par l'utilisateur.\n
/// Cette fonction est à appeler après la fonction PollChar()
/// si celle-ci a retournée une valeur positive. Cette fonction
/// est non bloquante.\n
/// Lire l'entrée stdin entre un CSLP_PollChar() et un CSLP_GetChar() a un
/// comportement indéfit.\n
/// Il est nécessaire d'appeller cette fonction de façon inconditionnelle
/// après un CSLP_PollChar().
///
/// \return 0 en cas d'erreur
/// \return Le code ASCII du caractère en cas de succès
/// \sa CSLP_PollChar(), CSLP_WaitChar()
///////////////////////////////////////////////////////////
int CSLP_GetChar();

///////////////////////////////////////////////////////////
/// Permet de récupérer la touche préssée par l'utilisateur.\n
/// Cette fonction est bloquante et retourne la valeur de la touche
/// saisite sans que la touche `Enter' sois pressée.
///
/// \return La valeur de la touche saisite
/// \sa CSLP_PollChar(), CSLP_GetChar()
///////////////////////////////////////////////////////////
int CSLP_WaitChar();

#ifdef __cplusplus
}
#endif

#endif
